package com.JavaNet.chapter5_url;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;

/**
 * desc Java提供了URL类，每一个URL对象封装了资源标识符和协议处理程序。获得URL对象的途径之一是调用URI的toURL()方法，也可以直接调用URL的构造函数来建立URL对象。
 * <p>
 * URL类有多个构造函数。其中最简单的是URL(String url), 它有一个String类型的参数。如果某个URL没有包含协议处理程序或该URL的协议是未知的，其他的构造函数
 * 会产生一个java.net.MalformedURLException。
 * 下面的代码片断演示了使用URL(String url)建立一个URL对象，该对象封装了一个简单的URL组件和http协议处理程序。
 * URL url = new URL ("http://www.informit.com");
 * <p>
 * 一旦拥有了URL对象，就可以使用getAuthority()、getDefaultPort()、 getFile()、 getHost()、 getPath()、getPort()、 getProtocol()、getQuery()、getRef()、getUserInfo()、getDefaultPort()等方法提取各种组件。
 * 如果URL中没有指定端口，getDefaultPort()方法返回URL对象的协议默认端口。getFile()方法返回路径和查询组件的结合体。getProtocol()方法返回资源的连接类型（例如http、mailto、ftp）。getRef()方法返回URL的片断。
 * 最后，getUserInfo()方法返回Authority的用户信息部分。还可以调用openStream()方法得到java.io.InputStream引用。使用这种引用，可以用面向字节的方式读取资源。
 * <p>
 * http://blog.csdn.net/joe_007/article/details/7939471
 **/
public class URLDemo {


    private static String baidu = "https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=HttpURLConnection";


    public static void main(String[] args) throws Exception {
        //readUrl();
        jCurl(baidu);
    }


    /**
     * 类似 于 curl 的功能;
     */
    private static void jCurl(String urlStr) throws Exception {

        URL url = new URL(urlStr);

        System.out.println("Authority = " + url.getAuthority());
        //HTTPS（securely transferring web pages）服务器，默认端口号为443/tcp  443/udp
        System.out.println("默认端口 Default port = " + url.getDefaultPort());
        System.out.println("File = " + url.getFile());
        System.out.println("Host = " + url.getHost());
        System.out.println("Path = " + url.getPath());
        System.out.println("Port = " + url.getPort());
        System.out.println("Protocol = " + url.getProtocol());
        System.out.println("Query 查询部分 = " + url.getQuery());
        System.out.println(" 锚定URL Ref = " + url.getRef());
        System.out.println("用户信息 User Info  = " + url.getUserInfo());

        System.out.print('\n');

        InputStream is = url.openStream();  // <------------------------  打开流

        int ch;
        while ((ch = is.read()) != -1) {
            System.out.print((char) ch);
        }
        is.close();
    }


    public static void readUrl() throws Exception {
        URL url = new URL(baidu);
        System.out.println("Protocol = " + url.getProtocol());
        System.out.println("Host =" + url.getHost());
        System.out.println("Port =" + url.getPort());
        System.out.println("Path =" + url.getPath());
        System.out.println("File =" + url.getFile());
        System.out.println("Ref =" + url.getRef());
        System.out.println("Query =" + url.getQuery());

        URLConnection urlConn = url.openConnection();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));

        String str = null;
        while ((str = bufferedReader.readLine()) != null) {
            System.out.println(str);
        }

        bufferedReader.close();
    }


}
